import axios from 'axios'
import { ElNotification } from 'element-plus'
// 这里不是使用useRouter函数获取router对象，直接导入即可
import router from '../router'
import { usePermissionStore } from '@/stores/permission'
import { useTabsStore } from '@/stores/tabs'

let permissionStore
let tabsStore

// 封装全局的request对象
const request = axios.create({
    baseURL: 'http://localhost', // 默认的请求基本路径
    timeout: 3000 // 默认的请求超时时间3秒
})

// 添加请求拦截器
request.interceptors.request.use(
    config => {
        // 获取全局的localStorage中的token
        // 如果存在token，证明已登录，在header中携带token
        const token = sessionStorage.getItem('token');
        if(token) {
            config.headers.token = token;
        }
        return config;
    },
    error => {
        // 请求错误
        ElNotification({
            message: error.message || error.response.data.status || '请求失败',
            type: 'error',
        })
        return Promise.reject(error);
    }
);

// 添加响应拦截器
request.interceptors.response.use(
    response => {
        // 如果是401，表示登录已失效，客户端需要删除token
        if (response.data.code === 401) {
            // 重置存储数据
            if(!permissionStore) {
                permissionStore = usePermissionStore()
            }
            if(!tabsStore) {
                tabsStore = useTabsStore()
            }
            permissionStore.resume()
            tabsStore.resume()
            // 物理层面的删除，从磁盘中删除
            // 清除本网站的一起前端存储，包括token、permission、tabs...
            sessionStorage.clear()
            router.push('/index/login')
        }
        // 直接返回响应的data属性，也就是服务端返回的result
        return response.data;
    }, 
    error => {
        // 响应异常，直接提示相关信息
        ElNotification({
            message: error.message || error.response.data.status || '响应失败',
            type: 'error',
        })
        return Promise.reject(error);
    }
);

export default request